#define _CRT_SECURE_NO_WARNINGS 1



//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//例如：
//数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5
//1 2 3 4 5 1 2 3 4 6
//#include<stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	int j = 0;
//	for (int i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	for (int i = 0; i < 10; i++)
//	{
//		for (int j = 1; j < 10; j++)
//		{
//			if (arr[i] - arr[j] == 0)
//				continue;
//		}
//		if (j == 10)
//			printf("%d ", arr[i]);
//
//
//	}
//	return 0;
//}

//不允许创建临时变量，交换两个整数的内容
//法一
//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	int b = 5;
//	a = a + b;//8
//	b = a - b;//3
//	a = a - b;//5
//	return 0;
//}
//法二
//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	int b = 5;
//	printf("交换前：a=%d,b=%d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("交换后：a=%d,b=%d\n", a, b);
//	return 0;
//}


//输入一个整数 n ，输出该数32位二进制表示中1的个数。其中负数用补码表示
// 
// 法一
//#include<stdio.h>
//
//int count_bit_one(unsigned int n)
//{
//	int count = 0;
//	while (n)
//	{
//
//		if ((n % 2) == 1)
//		{
//			count++;
//		}
//		n /= 2;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = count_bit_one(n);
//	printf("%d\n", ret);
//	return 0;
//}

//使用这个代码时，只有当n为整数时才运行正确；因为当n=-1时
//原码：1000 0000 0000 0000 0000 0000 0000 0001
//反码：1111 1111 1111 1111 1111 1111 1111 1110
//补码：1111 1111 1111 1111 1111 1111 1111 1111
//1的个数为32，但运行结果为0
//解决方法：当把负数在内存中储存的补码看作无符号数时，即可得出正解，即把函数接收的n的类型改为unsigned int；

//法二
//#include<stdio.h>
//int count_bit_one(int n)
//{
//	int count = 0;
//	for (int i = 0; i < 32; i++)   //此方法需要进行32次运算，效率较低
//	{
//		if ((n >> i) & 1 == 1)
//			count++;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = count_bit_one(n);
//	printf("%d\n", ret);
//	return 0;
//}

//法三
//n=11
//2进制：n=1011

//n=n&(n-1)
// n: 1011
//n-1:1010
// n: 1010  最右边的1被消除

//n=n&(n-1)
// n: 1010
//n-1:1001
// n: 1000  最右边的1被消除

//n=n&(n-1)
// n: 1000
//n-1:0111
// n: 0000  最右边的1被消除

//综上，n&（n-1) 的效果是把n的二进制最右边的1消除，
//因此每进行一次 n&（n-1）就有一个1被消除，可借此计算n的二进制中1的个数
#include<stdio.h>
int main()
{
	int n = 0;
	int count = 0;
	scanf("%d", &n);
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	printf("%d\n", count);
	return 0;
}
